from django.contrib import admin
from coupon.models import CouponModel, CouponDoctorRelationModel, CouponDepartmentRelationModel, \
    CouponHospitalRelationModel, CouponManage
# 存放到redis中
from django_redis import get_redis_connection
import json


# 医生
class CouponDoctorRelationAdmin(admin.TabularInline):
    model = CouponDoctorRelationModel
    fields = ['id', 'doctors']


# 科室
class CouponDepartmentRelationAdmin(admin.TabularInline):
    model = CouponDepartmentRelationModel
    fields = ['id', 'department']


# 医院
class CouponHospitalRelationAdmin(admin.TabularInline):
    model = CouponHospitalRelationModel
    fields = ['id', 'hospital']


# 优惠券
class CouponModelAdmin(admin.ModelAdmin):
    list_display = ['id', 'name', 'start_time', 'end_time', 'total', 'has_total', 'coupon_type', 'get_type']
    inlines = [CouponDoctorRelationAdmin, CouponDepartmentRelationAdmin, CouponHospitalRelationAdmin]


admin.site.register(CouponModel, CouponModelAdmin)


# 优惠券管理
class CouponManageAdmin(admin.ModelAdmin):
    list_display = ['id', 'user','name', 'coupon', 'use_status', 'use_time']

    # 钩子函数，在保存时，将优惠券的信息存入redis
    def save_model(self, request, obj, form, change):
        # 在管理站点中点击保存的时候，自动触发的函数——钩子函数
        # request: 本次客户端的请求对象
        # obj: 本次保存的对象
        # form: 本次保存的表单对象
        # change: 是否是修改操作 True/False, 新增操作是False,修改操作是True
        obj.save()  # 保存到数据库,mysql
        redis = get_redis_connection('coupon')  # 同步到redis
        # 存哪些内容
        if obj.use_status == 0 and obj.use_time == None:
            pipe = redis.pipeline()  # 开启管道
            pipe.multi()  # 开启事务

            # 存储优惠券的信息
            # 构建数据存储类型，字典，优惠券属性，全放到redis
            coupon_dict = {
                'coupon_id': obj.coupon.id,
                'name': obj.coupon.name,
                'discount': obj.coupon.discount,
                'get_discount_display': obj.coupon.get_discount_display(),
                'coupon_type': obj.coupon.coupon_type,
                'get_coupon_type_display': obj.coupon.get_coupon_type_display(),
                'get_type': obj.coupon.get_type,
                'get_get_type_display': obj.coupon.get_get_type_display(),
                'total': obj.coupon.total,
                'start_time': obj.coupon.start_time.strftime("%Y-%m-%d %H:%M:%S"),
                'end_time': obj.coupon.end_time.strftime("%Y-%m-%d %H:%M:%S"),
                'condition': obj.coupon.condition,
                'sale': obj.coupon.sale,
                'to_doctors': json.dumps(list(obj.coupon.to_doctors.values('doctor__id', 'doctor__name'))),
                'to_departments': json.dumps(
                    list(obj.coupon.to_departments.values('department__id', 'department__name'))),
                'to_hospitals': json.dumps(list(obj.coupon.to_hospitals.values('hospital__id', 'hospital__name'))),

            }
            pipe.hset(f'{obj.user.id}:{obj.id}', mapping=coupon_dict)

            print('存入redis中的数据的key，相当于表名，格式：用户ID+优惠券ID，值为一个字典，包含了优惠券的所有属性')
            print(f'{obj.user.id}:{obj.id}')

            from datetime import datetime
            # 存储优惠券的过期时间
            pipe.expire(f'{obj.user.id}:{obj.id}', int(obj.coupon.end_time.timestamp() - datetime.now().timestamp()))

            pipe.execute()
        else:
            # 如果优惠券状态为使用过，或者是过期
            # 优惠券的有使用时间，表示使用过
            # 将数据，从redis中删除
            redis.delete(f'{obj.user.id}:{obj.id}')

    # 管理站点，删除单个优惠券
    def delete_model(self, request, obj):
        # 删除单条数据
        redis = get_redis_connection('coupon')
        redis.delete(f'{obj.user.id}:{obj.id}')
        # 删除数据库中的数据
        obj.delete()

    # 管理站点，批量删除优惠券
    def delete_queryset(self, request, queryset):
        redis = get_redis_connection('coupon')
        for obj in queryset:
            redis.delete(f'{obj.user.id}:{obj.id}')
        # 删除数据库中的数据
        queryset.delete()


admin.site.register(CouponManage, CouponManageAdmin)
